LeetCode 141. Linked List Cycle (Easy)
題目連結
https://leetcode.com/problems/linked-list-cycle/
解題技巧
- Fast-slow Pointers (快慢指針法) : 使用兩個不同速度的指針遍歷線性結構。在這題中,一個走一步,另一個走兩步。如果這個 linked list 有循環,兩個指針一定會相遇。
解法
function hasCycle(head: ListNode | null): boolean {
let slow: ListNode | null = head;
let fast: ListNode | null = head;
while (fast && fast.next) {
fast = fast.next.next;
slow = slow!.next;
if (slow === fast) {
return true;
}
}
return false;
};
Complexity :
- Time: O(n),n 是 linked list 的節點數
- Space: O(1)
解釋
- 設定兩個指針,一個名為 fast,一個為 slow。剛開始都指向 head。
- 接著進入迴圈,每次迭代中,fast 指針每次向前移動兩個節點,而 slow 指針每次向前移動一個節點。在這邊用到
!
來斷言 slow 不為空。如果slow === fast
,代表兩個點相遇,表示存在循環,因此返回true
。 - 當 fast 和 fast.next 為空代表 linked list 已經遍歷完畢,並不存在循環,因此返回
false